์ ์ฐจ์ ์์ฑ์ ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ์ธ Perlin Noise์ ๋ณต์ก์ฑ์ ํ๊ตฌํ๊ณ , ๊ฒ์, ๊ทธ๋ํฝ ๋ฑ์์ ์ฌ์ค์ ์ด๊ณ ๋ค์ํ ์ฝํ ์ธ ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์ธ์.
์ ์ฐจ์ ์์ฑ: Perlin Noise ์ฌ์ธต ๋ถ์
์ ์ฐจ์ ์์ฑ์ ์๊ณ ๋ฆฌ์ฆ ๋ฐฉ์์ผ๋ก ์ฝํ ์ธ ๋ฅผ ์์ฑํ๋ ๊ฐ๋ ฅํ ๊ธฐ์ ๋ก, ์๋ ์ ์ ์์ด ๊ด๋ํ๊ณ ๋ค์ํ ์ธ๊ณ, ํ ์ค์ฒ ๋ฐ ํจํด์ ์์ฑํ ์ ์์ต๋๋ค. ๋ง์ ์ ์ฐจ์ ์์ฑ ์์คํ ์ ํต์ฌ์๋ ๋ถ๋๋ฝ๊ณ ์์ฐ์ค๋ฌ์ด ๋ฌด์์ ๊ฐ์ ์์ฑํ๊ธฐ ์ํ ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ์ธ Perlin Noise๊ฐ ์์ต๋๋ค. ์ด ๊ธฐ์ฌ์์๋ Perlin Noise์ ๋ณต์ก์ฑ, ์์ฉ ๋ถ์ผ, ์ฅ๋จ์ ์ ์ดํด๋ด ๋๋ค.
Perlin Noise๋ ๋ฌด์์ธ๊ฐ์?
1980๋ ๋ ์ด Ken Perlin์ด ๊ฐ๋ฐํ Perlin Noise๋ ํ์ค ๋ฐฑ์ ๋ ธ์ด์ฆ์ ๋นํด ๋ ์์ฐ์ค๋ฝ๊ณ ์ผ๊ด๋ ์์ฌ ๋์ ์ํ์ค๋ฅผ ์์ฑํ๋ ๊ธฐ์ธ๊ธฐ ๋ ธ์ด์ฆ ํจ์์ ๋๋ค. ํ์ค ๋ฐฑ์ ๋ ธ์ด์ฆ๋ ๋๋ ทํ๊ณ ๊ฑฐ์น ์ ํ์ ์ ๋ฐํ๋ ๋ฐ๋ฉด, Perlin Noise๋ ๋ถ๋๋ฝ๊ณ ์ฐ์์ ์ธ ๋ณํ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฌํ ํน์ฑ์ผ๋ก ์ธํด ์งํ, ๊ตฌ๋ฆ, ํ ์ค์ฒ ๋ฑ๊ณผ ๊ฐ์ ์์ฐ ํ์์ ์๋ฎฌ๋ ์ด์ ํ๋ ๋ฐ ์ด์์ ์ ๋๋ค. 1997๋ Ken Perlin์ Perlin Noise ์ ์์ผ๋ก ๊ธฐ์ ๊ณต๋ก์ ์์นด๋ฐ๋ฏธ ์์ ์์ํ์ต๋๋ค.
Perlin Noise๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฌด์์ ๊ธฐ์ธ๊ธฐ ๋ฒกํฐ์ ๊ฒฉ์๋ฅผ ์ ์ํ์ฌ ์๋ํฉ๋๋ค. ๊ณต๊ฐ์ ๊ฐ ์ ์๋ ๋ฌด์์ ๊ธฐ์ธ๊ธฐ๊ฐ ํ ๋น๋ฉ๋๋ค. ํน์ ์ง์ ์์ ๋ ธ์ด์ฆ ๊ฐ์ ๊ณ์ฐํ๊ธฐ ์ํด ์๊ณ ๋ฆฌ์ฆ์ ์ฃผ๋ณ ๊ฒฉ์ ์ ์ ๊ธฐ์ธ๊ธฐ ๋ฒกํฐ์ ํด๋น ๊ฒฉ์ ์ ์์ ํด๋น ์ง์ ์ผ๋ก์ ๋ฒกํฐ์ ์ ๊ณฑ์ ๋ณด๊ฐํฉ๋๋ค. ์ด ๋ณด๊ฐ ํ๋ก์ธ์ค๋ ๋ถ๋๋ฝ๊ณ ์ฐ์์ ์ธ ์ถ๋ ฅ์ ๋ณด์ฅํฉ๋๋ค.
Perlin Noise์ ์๋ ๋ฐฉ์: ๋จ๊ณ๋ณ ์ค๋ช
Perlin Noise ์์ฑ ํ๋ก์ธ์ค๋ฅผ ๋ ๊ฐ๋จํ ๋จ๊ณ๋ก ๋๋์ด ๋ณด๊ฒ ์ต๋๋ค.
- ๊ฒฉ์ ์ ์: ๊ณต๊ฐ(1D, 2D ๋๋ 3D) ์์ ๊ฒน์ณ์ง๋ ๊ทธ๋ฆฌ๋(๊ฒฉ์)๋ฅผ ์์ํด ๋ณด์ธ์. ์ด ๊ทธ๋ฆฌ๋์ ๊ฐ๊ฒฉ์ ๋ ธ์ด์ฆ์ ์ฃผํ์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ๊ฐ๊ฒฉ์ด ์์์๋ก ๊ณ ์ฃผํ์ ๋ ์์ธํ ๋ ธ์ด์ฆ๊ฐ ์์ฑ๋๊ณ ๊ฐ๊ฒฉ์ด ํด์๋ก ์ ์ฃผํ์ ๋ ๋ถ๋๋ฌ์ด ๋ ธ์ด์ฆ๊ฐ ์์ฑ๋ฉ๋๋ค.
- ๋ฌด์์ ๊ธฐ์ธ๊ธฐ ํ ๋น: ๊ฒฉ์์ ๊ฐ ์ (๊ผญ์ง์ )์ ๋ฌด์์ ๊ธฐ์ธ๊ธฐ ๋ฒกํฐ๋ฅผ ํ ๋นํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ์ธ๊ธฐ๋ ์ผ๋ฐ์ ์ผ๋ก ์ ๊ทํ๋ฉ๋๋ค(๊ธธ์ด 1). ์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ๊ธฐ์ธ๊ธฐ๊ฐ ์์ฌ ๋ฌด์์์ฌ์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ๋ ธ์ด์ฆ๊ฐ ๋ฐ๋ณต ๊ฐ๋ฅํ๋๋ก ๊ฒฉ์ ์ ์ ์ขํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฐ์ ๋ก ์ ์ด์ด์ผ ํฉ๋๋ค.
- ์ ๊ณฑ ๊ณ์ฐ: ๋ ธ์ด์ฆ ๊ฐ์ ๊ณ์ฐํ๋ ค๋ ์ฃผ์ด์ง ์ ์ ๊ฒฝ์ฐ ํด๋น ์ ์ด ์ํ ๊ฒฉ์ ์ ์ ๊ฒฐ์ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ ์ ๋๋ฌ์ผ ๊ฐ ๊ฒฉ์์ ์ ๋ํด ํด๋น ๊ฒฉ์์ ์์ ๊ด์ฌ ์ง์ ๊น์ง์ ๋ฒกํฐ๋ฅผ ๊ณ์ฐํฉ๋๋ค. ์ด ๋ฒกํฐ์ ํด๋น ๊ฒฉ์์ ์ ํ ๋น๋ ๊ธฐ์ธ๊ธฐ ๋ฒกํฐ์ ์ ๊ณฑ์ ๊ตฌํฉ๋๋ค.
- ๋ณด๊ฐ: ์ด๊ฒ์ Perlin Noise๋ฅผ ๋ถ๋๋ฝ๊ฒ ๋ง๋๋ ์ค์ํ ๋จ๊ณ์ ๋๋ค. ์ด์ ๋จ๊ณ์์ ๊ณ์ฐ๋ ์ ๊ณฑ์ ๋ณด๊ฐํฉ๋๋ค. ๋ณด๊ฐ ํจ์๋ ์ ํ ๋ณด๊ฐ ๋์ ์ฝ์ฌ์ธ ๋๋ smoothstep ํจ์์ ๊ฐ์ ๋ถ๋๋ฌ์ด ๊ณก์ ์ด ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๊ฒฉ์ ์ ๊ฐ์ ์ ํ์ด ์ํํ๊ฒ ์ด๋ฃจ์ด์ง๋๋ค.
- ์ ๊ทํ: ๋ง์ง๋ง์ผ๋ก, ๋ณด๊ฐ๋ ๊ฐ์ ์ผ๋ฐ์ ์ผ๋ก -1์์ 1 ์ฌ์ด ๋๋ 0์์ 1 ์ฌ์ด์ ๋ฒ์๋ก ์ ๊ทํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ ธ์ด์ฆ ํจ์์ ์ผ๊ด๋ ์ถ๋ ฅ ๋ฒ์๊ฐ ์ ๊ณต๋ฉ๋๋ค.
๋ฌด์์ ๊ธฐ์ธ๊ธฐ์ ๋ถ๋๋ฌ์ด ๋ณด๊ฐ์ ์กฐํฉ์ Perlin Noise์ ํน์ ์ ๋ถ๋๋ฝ๊ณ ์ ๊ธฐ์ ์ธ ๋ชจ์์ ๋ถ์ฌํฉ๋๋ค. ๋ ธ์ด์ฆ์ ์ฃผํ์์ ์งํญ์ ๊ฒฉ์ ๊ฐ๊ฒฉ์ ์กฐ์ ํ๊ณ ์ต์ข ๋ ธ์ด์ฆ ๊ฐ์ ๋ฐฐ์จ ์ธ์๋ฅผ ๊ณฑํ์ฌ ์ ์ดํ ์ ์์ต๋๋ค.
Perlin Noise์ ์ฅ์
- ๋ถ๋๋ฝ๊ณ ์ฐ์์ ์ธ ์ถ๋ ฅ: ๋ณด๊ฐ ๋ฐฉ์์ ๋ถ๋๋ฝ๊ณ ์ฐ์์ ์ธ ์ถ๋ ฅ์ ๋ณด์ฅํ์ฌ ๋ฐฑ์ ๋ ธ์ด์ฆ์ ๊ฑฐ์น ์ ํ์ ๋ฐฉ์งํฉ๋๋ค.
- ์ ์ด ๊ฐ๋ฅํ ์ฃผํ์ ๋ฐ ์งํญ: ๋ ธ์ด์ฆ์ ์ฃผํ์์ ์งํญ์ ์ฝ๊ฒ ์กฐ์ ํ ์ ์์ผ๋ฏ๋ก ๊ด๋ฒ์ํ ์๊ฐ์ ํจ๊ณผ๋ฅผ ์ป์ ์ ์์ต๋๋ค.
- ๋ฐ๋ณต ๊ฐ๋ฅ: Perlin Noise๋ ๊ฒฐ์ ๋ก ์ ์ด๋ฏ๋ก ๋์ผํ ์ ๋ ฅ ์ขํ๊ฐ ์ฃผ์ด์ง๋ฉด ํญ์ ๋์ผํ ์ถ๋ ฅ ๊ฐ์ ์์ฑํฉ๋๋ค. ์ด๋ ์ ์ฐจ์ ์์ฑ์์ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ : ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ ์ฅํ ํ์๊ฐ ์์ต๋๋ค. ๊ฒฉ์์ ๋ํ ๊ธฐ์ธ๊ธฐ ๋ฒกํฐ ์งํฉ๋ง ํ์ํฉ๋๋ค.
- ๋ค์ฐจ์: Perlin Noise๋ ๋ค์ํ ์์ฉ ๋ถ์ผ์ ์ ์ฉํ๋๋ก ์ฌ๋ฌ ์ฐจ์(1D, 2D, 3D ๋ฐ ๋ ๋์ ์ฐจ์)์ผ๋ก ํ์ฅํ ์ ์์ต๋๋ค.
Perlin Noise์ ๋จ์
- ๊ณ์ฐ ๋น์ฉ: Perlin Noise๋ฅผ ๊ณ์ฐํ๋ ๊ฒ์ ํนํ ๋ ๋์ ์ฐจ์์์ ๋๋ ๋๊ท๋ชจ ํ ์ค์ฒ๋ฅผ ์์ฑํ ๋ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค.
- ๋์ ๋๋ ์ํฐํฉํธ: ํน์ ์ฃผํ์ ๋ฐ ํด์๋์์ Perlin Noise๋ ๊ทธ๋ฆฌ๋์ ๊ฐ์ ํจํด์ด๋ ๋ฐ๋ณต์ ์ธ ํน์ง๊ณผ ๊ฐ์ ๋์ ๋๋ ์ํฐํฉํธ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค.
- ํน์ง์ ๋ํ ์ ํ๋ ์ ์ด: Perlin Noise์ ์ ๋ฐ์ ์ธ ๋ชจ์์ ์ฃผํ์์ ์งํญ์ ํตํด ์ ์ดํ ์ ์์ง๋ง ํน์ ํน์ง์ ๋ํ ์ ์ด๊ฐ ์ ํ์ ์ ๋๋ค.
- Simplex Noise๋ณด๋ค ๋ ๋ฑ๋ฐฉ์ฑ: ํนํ ๋ ๋์ ์ฐจ์์์ ์ถ ์ ๋ ฌ ์ํฐํฉํธ๋ฅผ ๋ํ๋ผ ์ ์์ต๋๋ค.
Perlin Noise์ ์์ฉ ๋ถ์ผ
Perlin Noise๋ ํนํ ์ปดํจํฐ ๊ทธ๋ํฝ ๋ฐ ๊ฒ์ ๊ฐ๋ฐ ๋ถ์ผ์์ ๊ด๋ฒ์ํ ์์ฉ ๋ถ์ผ๋ฅผ ๊ฐ์ง ๋ค์ฌ๋ค๋ฅํ ๋๊ตฌ์ ๋๋ค.
1. ์งํ ์์ฑ
Perlin Noise์ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์์ฉ ๋ถ์ผ ์ค ํ๋๋ ์งํ ์์ฑ์ ๋๋ค. ๋ ธ์ด์ฆ ๊ฐ์ ๋์ด ๊ฐ์ผ๋ก ํด์ํจ์ผ๋ก์จ ์ฐ, ๊ณ๊ณก ๋ฐ ์ธ๋์ด ์๋ ํ์ค์ ์ธ ํ๊ฒฝ์ ๋ง๋ค ์ ์์ต๋๋ค. ๋ ธ์ด์ฆ์ ์ฃผํ์์ ์งํญ์ ์กฐ์ ํ์ฌ ์งํ์ ์ ๋ฐ์ ์ธ ๊ฑฐ์น ๊ธฐ์ ๊ท๋ชจ๋ฅผ ์ ์ดํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Minecraft์ ๊ฐ์ ๊ฒ์(Perlin Noise๋ง ๋ ์ ์ ์ผ๋ก ์ฌ์ฉํ์ง๋ ์์ง๋ง ์ ์ฌํ ๊ธฐ์ ์ ํตํฉ)์์ ์งํ ์์ฑ์ ํ๋ ์ด์ด๊ฐ ํํํ๋ ๋ค์ํ ํ๊ฒฝ์ ๋ง๋ค๊ธฐ ์ํด ๋ ธ์ด์ฆ ํจ์์ ์์กดํฉ๋๋ค. *No Man's Sky*์ ๊ฐ์ ๋ง์ ์คํ ์๋ ๊ฒ์์ ์ธ๊ณ ์์ฑ์ ํ ๊ตฌ์ฑ ์์๋ก Perlin Noise์ ๋ณํ์ ์ฌ์ฉํฉ๋๋ค.
์: ํ๋ ์ด์ด๊ฐ ๊ด๋ํ ์ ์ฐจ์ ์ผ๋ก ์์ฑ๋ ํ๊ฒฝ์ ํํํ ์ ์๋ ๊ฒ์ ์ธ๊ณ๋ฅผ ์์ํด ๋ณด์ธ์. Perlin Noise๋ฅผ ์ฌ์ฉํ์ฌ ์งํ์ ๋ํ ๋์ด ๋งต์ ๋ง๋ค ์ ์์ผ๋ฉฐ, ๋ ธ์ด์ฆ์ ๋ค๋ฅธ ์ฅํ๋ธ(๋์ค์ ์ค๋ช )๊ฐ ์ธ๋ถ ์ฌํญ๊ณผ ๋ณํ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋ ๋์ ์ฃผํ์์ ๋ ธ์ด์ฆ๋ ๋ ์์ ๋ฐ์์ ๋ฒํ๋ฅผ ๋ํ๋ผ ์ ์๋ ๋ฐ๋ฉด, ๋ ๋ฎ์ ์ฃผํ์๋ ๊ตฌ๋ถ๊ตฌ๋ถํ ์ธ๋๊ณผ ์ฐ์ ๋ง๋ญ๋๋ค.
2. ํ ์ค์ฒ ์์ฑ
Perlin Noise๋ ๊ตฌ๋ฆ, ๋๋ฌด, ๋๋ฆฌ์ ๋ฐ ๊ธ์๊ณผ ๊ฐ์ ๋ค์ํ ์ฌ๋ฃ์ ๋ํ ํ ์ค์ฒ๋ฅผ ๋ง๋๋ ๋ฐ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ ธ์ด์ฆ ๊ฐ์ ๋ค๋ฅธ ์์ ๋๋ ์ฌ๋ฃ ์์ฑ์ ๋งคํํ์ฌ ํ์ค์ ์ด๊ณ ์๊ฐ์ ์ผ๋ก ๋งค๋ ฅ์ ์ธ ํ ์ค์ฒ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด Perlin Noise๋ ๋๋ฌด์ ๋๋ญ๊ฒฐ์ด๋ ๋๋ฆฌ์์ ์์ฉ๋์ด๋ฅผ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค. Adobe Photoshop ๋ฐ GIMP์ ๊ฐ์ ๋ง์ ๋์งํธ ์ํธ ํ๋ก๊ทธ๋จ์ ํ ์ค์ฒ๋ฅผ ๋น ๋ฅด๊ฒ ์์ฑํ๊ธฐ ์ํด Perlin Noise ๊ธฐ๋ฐ ํํฐ๋ฅผ ํตํฉํฉ๋๋ค.
์: ๋๋ฌด ํ ์ด๋ธ์ 3D ๋ ๋๋ง์ ์๊ฐํด ๋ณด์ธ์. Perlin Noise๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฌด ๋๋ญ๊ฒฐ ํ ์ค์ฒ๋ฅผ ์์ฑํ์ฌ ํ๋ฉด์ ๊น์ด์ ํ์ค๊ฐ์ ๋ํ ์ ์์ต๋๋ค. ๋ ธ์ด์ฆ ๊ฐ์ ์์ ๋ฐ ๋ฒํ์ ๋ณํ์ ๋งคํ๋์ด ํ์ค์ ์ธ ๋๋ฌด ๋๋ญ๊ฒฐ ํจํด์ ๋ง๋ญ๋๋ค.
3. ๊ตฌ๋ฆ ์๋ฎฌ๋ ์ด์
ํ์ค์ ์ธ ๊ตฌ๋ฆ ํ์ฑ์ ์์ฑํ๋ ๊ฒ์ ๊ณ์ฐ ์ง์ฝ์ ์ผ ์ ์์ต๋๋ค. Perlin Noise๋ ๊ตฌ๋ฆ๊ณผ ๊ฐ์ ํจํด์ ์์ฑํ๋ ๋น๊ต์ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ ธ์ด์ฆ ๊ฐ์ ์ฌ์ฉํ์ฌ ๊ตฌ๋ฆ ์ ์์ ๋ฐ๋ ๋๋ ๋ถํฌ๋ช ๋๋ฅผ ์ ์ดํจ์ผ๋ก์จ ๋ชจ์๊ณผ ํฌ๊ธฐ๊ฐ ๋ค์ํ ์ค๋๋ ฅ ์๋ ๊ตฌ๋ฆ ํ์ฑ์ ๋ง๋ค ์ ์์ต๋๋ค. *Cloudy with a Chance of Meatballs*์ ๊ฐ์ ์ํ์์ ๋ ธ์ด์ฆ ํจ์๋ฅผ ํฌํจํ ์ ์ฐจ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฐํ ์ธ๊ณ์ ์บ๋ฆญํฐ๋ฅผ ๋ง๋ค์์ต๋๋ค.
์: ๋นํ ์๋ฎฌ๋ ์ดํฐ์์ Perlin Noise๋ฅผ ์ฌ์ฉํ์ฌ ํ์ค์ ์ธ ๊ตฌ๋ฆ ํ๊ฒฝ์ ์์ฑํ ์ ์์ต๋๋ค. ๋ ธ์ด์ฆ ๊ฐ์ ์ฌ์ฉํ์ฌ ๊ตฌ๋ฆ์ ๋ฐ๋๋ฅผ ์ ์ดํ์ฌ ์์ ๊ถ์ด์ด๋ ์กฐ๋ฐํ ์ ์ด์ ๋ง๋ค ์ ์์ต๋๋ค. ๋ ธ์ด์ฆ์ ๋ค๋ฅธ ๋ ์ด์ด๋ฅผ ๊ฒฐํฉํ์ฌ ๋ ๋ณต์กํ๊ณ ๋ค์ํ ๊ตฌ๋ฆ ํ์ฑ์ ๋ง๋ค ์ ์์ต๋๋ค.
4. ์ ๋๋ฉ์ด์ ๋ฐ ํจ๊ณผ
Perlin Noise๋ ํ์ฌ, ์ฐ๊ธฐ, ๋ฌผ ๋ฐ ๋๋ฅ์ ๊ฐ์ ๋ค์ํ ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ ธ์ด์ฆ ํจ์์ ์ ๋ ฅ ์ขํ๋ฅผ ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ผ ์ ๋๋ฉ์ด์ ํํ์ฌ ์ญ๋์ ์ด๊ณ ์งํํ๋ ํจํด์ ๋ง๋ค ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Perlin Noise๋ฅผ ์ ๋๋ฉ์ด์ ํํ๋ฉด ๋ถ๊ฝ์ ๊น๋ฐ์ ๋๋ ์ฐ๊ธฐ์ ์์ฉ๋์ด๋ฅผ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค. Houdini์ ๊ฐ์ ์๊ฐ ํจ๊ณผ ์ํํธ์จ์ด๋ ์๋ฎฌ๋ ์ด์ ์ ๋ ธ์ด์ฆ ํจ์๋ฅผ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํฉ๋๋ค.
์: ๋ง๋ฒ์ ํฌํ์ด ์ด๋ฆฌ๋ ์๊ฐ ํจ๊ณผ๋ฅผ ์๊ฐํด ๋ณด์ธ์. Perlin Noise๋ฅผ ์ฌ์ฉํ์ฌ ํฌํ ์ฃผ๋ณ์ ์์ฉ๋์ด์น๋ ํผ๋์ ์๋์ง๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ, ๋ ธ์ด์ฆ ๊ฐ์ ํจ๊ณผ์ ์์๊ณผ ๊ฐ๋๋ฅผ ์ ์ดํฉ๋๋ค. ๋ ธ์ด์ฆ์ ์ ๋๋ฉ์ด์ ์ ์ญ๋์ ์ธ ์๋์ง์ ์์ง์์ ๋๋์ ๋ง๋ญ๋๋ค.
5. ์์ ๋ฐ ๋์์ธ ์ฐฝ์
์์ ํ ๊ธฐ๋ฅ์ ์ธ ์์ฉ ๋ถ์ผ ์ธ์๋ Perlin Noise๋ ์ถ์ ํจํด, ์๊ฐํ ๋ฐ ์์ฑ ์์ ์ํ์ ์์ฑํ๋ ์์ ์ ๋ ธ๋ ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ ๊ธฐ์ ์ด๊ณ ์์ธก ๋ถ๊ฐ๋ฅํ ํน์ฑ์ ํฅ๋ฏธ๋กญ๊ณ ๋ฏธํ์ ์ผ๋ก ๋ง์กฑ์ค๋ฌ์ด ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. Casey Reas์ ๊ฐ์ ์์ ๊ฐ๋ค์ ์์ฑ ์๊ณ ๋ฆฌ์ฆ์ ์์ ์ ์ํ์์ ๊ด๋ฒ์ํ๊ฒ ํ์ฉํ๋ฉฐ, ์ข ์ข ๋ ธ์ด์ฆ ํจ์๋ฅผ ํต์ฌ ์์๋ก ์ฌ์ฉํฉ๋๋ค.
์: ์์ ๊ฐ๋ Perlin Noise๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ จ์ ์ถ์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๊ณ , ๋ ํนํ๊ณ ์๊ฐ์ ์ผ๋ก ๋งค๋ ฅ์ ์ธ ๊ตฌ์ฑ์ ๋ง๋ค๊ธฐ ์ํด ๋ค์ํ ์์ ํ๋ ํธ์ ๋ ธ์ด์ฆ ๋งค๊ฐ๋ณ์๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ ์ด๋ฏธ์ง๋ ์ํ์ผ๋ก ์ธ์ ๋ฐ ํ์๋ ์ ์์ต๋๋ค.
Perlin Noise์ ๋ณํ ๋ฐ ํ์ฅ
Perlin Noise๋ ๊ทธ ์์ฒด๋ก ๊ฐ๋ ฅํ ๊ธฐ์ ์ด์ง๋ง, ์ผ๋ถ ์ ํ ์ฌํญ์ ํด๊ฒฐํ๊ฑฐ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ช ๊ฐ์ง ๋ณํ ๋ฐ ํ์ฅ์ ๋ณ์์ต๋๋ค. ๋ช ๊ฐ์ง ์ฃผ๋ชฉํ ๋งํ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. Simplex Noise
Simplex Noise๋ Ken Perlin ์์ ์ด ๊ฐ๋ฐํ Perlin Noise์ ์๋กญ๊ณ ๊ฐ์ ๋ ๋์์ ๋๋ค. ํนํ ๋ ๋์ ์ฐจ์์์ ๊ณ์ฐ ๋น์ฉ๊ณผ ๋์ ๋๋ ์ํฐํฉํธ์ ์กด์ฌ์ ๊ฐ์ Perlin Noise์ ๋ช ๊ฐ์ง ์ ํ ์ฌํญ์ ํด๊ฒฐํฉ๋๋ค. Simplex Noise๋ ๋ ๊ฐ๋จํ ๊ธฐ๋ณธ ๊ตฌ์กฐ(๋จ์ ๊ทธ๋ฆฌ๋)๋ฅผ ์ฌ์ฉํ๋ฉฐ, ํนํ 2D ๋ฐ 3D์์ Perlin Noise๋ณด๋ค ์ผ๋ฐ์ ์ผ๋ก ๊ณ์ฐ ์๋๊ฐ ๋น ๋ฆ ๋๋ค. ๋ํ Perlin Noise๋ณด๋ค ๋ ๋์ ๋ฑ๋ฐฉ์ฑ(๋ฐฉํฅ ๋ฐ์ด์ด์ค ๊ฐ์)์ ๋ํ๋ ๋๋ค.
2. OpenSimplex Noise
Simplex Noise๋ฅผ ๊ฐ์ ํ OpenSimplex๋ ์๋ Simplex ์๊ณ ๋ฆฌ์ฆ์ ์กด์ฌํ๋ ๋ฐฉํฅ์ฑ ์ํฐํฉํธ๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. Kurt Spencer๊ฐ ๊ฐ๋ฐํ OpenSimplex๋ ์ด์ ๋ฒ์ ๋ณด๋ค ๋ ์๊ฐ์ ์ผ๋ก ๋ฑ๋ฐฉ์ฑ์ธ ๊ฒฐ๊ณผ๋ฅผ ์ป์ผ๋ ค๊ณ ์๋ํฉ๋๋ค.
3. ํ๋ํ ๋ ธ์ด์ฆ(fBm - ๋ถ์ ๋ธ๋ผ์ด ์ด๋)
ํ๋ํ ๋ ธ์ด์ฆ๋ fBm(๋ถ์ ๋ธ๋ผ์ด ์ด๋)์ด๋ผ๊ณ ๋ ํ๋ฉฐ, ๋ ธ์ด์ฆ ํจ์ ์์ฒด๊ฐ ์๋๋ผ ๋ค์ํ ์ฃผํ์์ ์งํญ์์ Perlin Noise(๋๋ ๊ธฐํ ๋ ธ์ด์ฆ ํจ์)์ ์ฌ๋ฌ ์ฅํ๋ธ๋ฅผ ๊ฒฐํฉํ๋ ๊ธฐ์ ์ ๋๋ค. ๊ฐ ์ฅํ๋ธ๋ ๋ค๋ฅธ ๊ท๋ชจ๋ก ์ธ๋ถ ์ฌํญ์ ์ ๊ณตํ์ฌ ๋ ๋ณต์กํ๊ณ ์ฌ์ค์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ญ๋๋ค. ๋ ๋์ ์ฃผํ์๋ ๋ ๋ฏธ์ธํ ์ธ๋ถ ์ฌํญ์ ์ถ๊ฐํ๋ ๋ฐ๋ฉด, ๋ ๋ฎ์ ์ฃผํ์๋ ์ ์ฒด ๋ชจ์์ ์ ๊ณตํฉ๋๋ค. ๊ฐ ์ฅํ๋ธ์ ์งํญ์ ์ผ๋ฐ์ ์ผ๋ก lacunarity(์ผ๋ฐ์ ์ผ๋ก 2.0)๋ผ๋ ์ธ์๋ก ์ถ์๋์ด ๋ ๋์ ์ฃผํ์๊ฐ ์ ๋ฐ์ ์ธ ๊ฒฐ๊ณผ์ ๋ ๊ธฐ์ฌํ๋๋ก ํฉ๋๋ค. fBm์ ํ์ค์ ์ธ ์งํ, ๊ตฌ๋ฆ ๋ฐ ํ ์ค์ฒ๋ฅผ ์์ฑํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. Unity ์งํ ์์ง์ *Hills* ์์ ์งํ์ ๋ถ์ ๋ธ๋ผ์ด ์ด๋์ ์ฌ์ฉํฉ๋๋ค.
์: fBm์ผ๋ก ์งํ์ ์์ฑํ ๋ ์ฒซ ๋ฒ์งธ ์ฅํ๋ธ๋ ์ฐ๊ณผ ๊ณ๊ณก์ ์ ์ฒด ๋ชจ์์ ๋ง๋ค ์ ์์ต๋๋ค. ๋ ๋ฒ์งธ ์ฅํ๋ธ๋ ๋ ์์ ์ธ๋๊ณผ ๋ฅ์ ์ ์ถ๊ฐํฉ๋๋ค. ์ธ ๋ฒ์งธ ์ฅํ๋ธ๋ ๋ฐ์์ ์กฐ์ฝ๋์ ์ถ๊ฐํ๋ ๋ฑ ๊ฐ ์ฅํ๋ธ๋ ์ ์ง์ ์ผ๋ก ๋ ์์ ๊ท๋ชจ๋ก ์ธ๋ถ ์ฌํญ์ ์ถ๊ฐํ์ฌ ํ์ค์ ์ด๊ณ ๋ค์ํ ํ๊ฒฝ์ ๋ง๋ญ๋๋ค.
4. ๋๋ฅ
๋๋ฅ๋ ๋ ธ์ด์ฆ ํจ์์ ์ ๋๊ฐ์ ์ฌ์ฉํ๋ ํ๋ํ ๋ ธ์ด์ฆ์ ๋ณํ์ ๋๋ค. ์ด๋ฅผ ํตํด ํ์ฌ, ์ฐ๊ธฐ ๋ฐ ํญ๋ฐ๊ณผ ๊ฐ์ ํจ๊ณผ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๋ ๋ฐ ์ ์ฉํ ๋ ํผ๋์ค๋ฝ๊ณ ๋๋ฅ์ ์ธ ๋ชจ์์ด ์์ฑ๋ฉ๋๋ค.
์ค์ฉ์ ์ธ ๊ตฌํ ํ
ํ๋ก์ ํธ์์ Perlin Noise๋ฅผ ๊ตฌํํ ๋ ์ผ๋์ ๋์ด์ผ ํ ๋ช ๊ฐ์ง ์ค์ฉ์ ์ธ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: Perlin Noise๋ ํนํ ๋ ๋์ ์ฐจ์์์ ๋๋ ๋๊ท๋ชจ ํ ์ค์ฒ๋ฅผ ์์ฑํ ๋ ๊ณ์ฐ ๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์ต๋๋ค. ๋ฏธ๋ฆฌ ๊ณ์ฐ๋ ๊ฐ์ ๋ํ ์กฐํ ํ ์ด๋ธ์ ์ฌ์ฉํ๊ฑฐ๋ Simplex Noise์ ๊ฐ์ ๋ ๋น ๋ฅธ ๋ ธ์ด์ฆ ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ์ ์ต์ ํํ๋ ๊ฒ์ ๊ณ ๋ คํด ๋ณด์ธ์.
- ์ฌ๋ฌ ์ฅํ๋ธ ์ฌ์ฉ: Perlin Noise์ ์ฌ๋ฌ ์ฅํ๋ธ(fBm)๋ฅผ ๊ฒฐํฉํ๋ ๊ฒ์ ๊ฒฐ๊ณผ์ ์ธ๋ถ ์ฌํญ๊ณผ ๋ณํ๋ฅผ ์ถ๊ฐํ๋ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค. ์ํ๋ ํจ๊ณผ๋ฅผ ์ป์ผ๋ ค๋ฉด ๋ค์ํ ์ฃผํ์์ ์งํญ์ ์คํํด ๋ณด์ธ์.
- ๊ฒฐ๊ณผ ์ ๊ทํ: ์ผ๊ด๋ ๊ฒฐ๊ณผ๋ฅผ ์ํด ๋ ธ์ด์ฆ ๊ฐ์ด ์ผ๊ด๋ ๋ฒ์(์: -1์์ 1, ๋๋ 0์์ 1)๋ก ์ ๊ทํ๋์๋์ง ํ์ธํ์ธ์.
- ๋ค๋ฅธ ๋ณด๊ฐ ํจ์๋ฅผ ์คํํด ๋ณด์ธ์: ๋ณด๊ฐ ํจ์์ ์ ํ์ ๋ ธ์ด์ฆ์ ๋ชจ์์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ์ฅ ์ ํฉํ ํจ์๋ฅผ ์ฐพ์ผ๋ ค๋ฉด ์ฝ์ฌ์ธ ๋ณด๊ฐ ๋๋ smoothstep ๋ณด๊ฐ๊ณผ ๊ฐ์ ๋ค๋ฅธ ํจ์๋ฅผ ์คํํด ๋ณด์ธ์.
- ๋์ ์์ฑ๊ธฐ์ ์๋ํ๊ธฐ: Perlin Noise๊ฐ ๋ฐ๋ณต ๊ฐ๋ฅํ๋๋ก ํ๋ ค๋ฉด ๋์ ์์ฑ๊ธฐ๋ฅผ ์ผ๊ด๋ ๊ฐ์ผ๋ก ์๋ํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋์ผํ ์ ๋ ฅ ์ขํ๊ฐ ํญ์ ๋์ผํ ์ถ๋ ฅ ๊ฐ์ ์์ฑํฉ๋๋ค.
์ฝ๋ ์์ (์์ฌ ์ฝ๋)
2D Perlin Noise๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋จ์ํ๋ ์์ฌ ์ฝ๋ ์์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
function perlinNoise2D(x, y, seed):
// 1. ๊ฒฉ์(๊ทธ๋ฆฌ๋) ์ ์
gridSize = 10 // ์์ ๊ทธ๋ฆฌ๋ ํฌ๊ธฐ
// 2. ๊ฒฉ์์ ์ ๋ฌด์์ ๊ธฐ์ธ๊ธฐ ํ ๋น
function getGradient(i, j, seed):
random = hash(i, j, seed) // ์์ฌ ๋์๋ฅผ ์์ฑํ๋ ํด์ ํจ์
angle = random * 2 * PI // ๋์๋ฅผ ๊ฐ๋๋ก ๋ณํ
return (cos(angle), sin(angle)) // ๊ธฐ์ธ๊ธฐ ๋ฒกํฐ ๋ฐํ
// 3. ์ (x, y)์ ํฌํจํ๋ ๊ฒฉ์ ์
๊ฒฐ์
x0 = floor(x / gridSize) * gridSize
y0 = floor(y / gridSize) * gridSize
x1 = x0 + gridSize
y1 = y0 + gridSize
// 4. ์ ๊ณฑ ๊ณ์ฐ
s = dotProduct(getGradient(x0, y0, seed), (x - x0, y - y0))
t = dotProduct(getGradient(x1, y0, seed), (x - x1, y - y0))
u = dotProduct(getGradient(x0, y1, seed), (x - x0, y - y1))
v = dotProduct(getGradient(x1, y1, seed), (x - x1, y - y1))
// 5. ๋ณด๊ฐ(smoothstep ์ฌ์ฉ)
sx = smoothstep((x - x0) / gridSize)
sy = smoothstep((y - y0) / gridSize)
ix0 = lerp(s, t, sx)
ix1 = lerp(u, v, sx)
value = lerp(ix0, ix1, sy)
// 6. ์ ๊ทํ
return value / maxPossibleValue // -1์์ 1๋ก ์ ๊ทํ(๊ทผ์ฌ)
์ฐธ๊ณ : ์ด๋ ์ค๋ช ์ ์ํ ๋จ์ํ๋ ์์ ๋๋ค. ์์ ํ ๊ตฌํ์๋ ๋ ๊ฐ๋ ฅํ ๋์ ์์ฑ๊ธฐ ๋ฐ ๋ ์ ๊ตํ ๋ณด๊ฐ ํจ์๊ฐ ํ์ํฉ๋๋ค.
๊ฒฐ๋ก
Perlin Noise๋ ๋ถ๋๋ฝ๊ณ ์์ฐ์ค๋ฌ์ด ๋ฌด์์ ๊ฐ์ ์์ฑํ๊ธฐ ์ํ ๊ฐ๋ ฅํ๊ณ ๋ค์ฌ๋ค๋ฅํ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. ์งํ ์์ฑ ๋ฐ ํ ์ค์ฒ ์์ฑ๋ถํฐ ์ ๋๋ฉ์ด์ ๋ฐ ์๊ฐ ํจ๊ณผ์ ์ด๋ฅด๊ธฐ๊น์ง ์์ฉ ๋ถ์ผ๊ฐ ๊ด๋ํ๊ณ ๋ค์ํฉ๋๋ค. ๊ณ์ฐ ๋น์ฉ๊ณผ ๋์ ๋๋ ์ํฐํฉํธ์ ๊ฐ๋ฅ์ฑ๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ ํ ์ฌํญ์ด ์์ง๋ง ์ฅ์ ์ด ๋จ์ ์ ํจ์ฌ ๋ฅ๊ฐํ์ฌ ์ ์ฐจ์ ์์ฑ์ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ฐ๋ฐ์ ๋๋ ์ํฐ์คํธ์๊ฒ ๊ท์คํ ๋๊ตฌ๊ฐ ๋ฉ๋๋ค.
Perlin Noise์ ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์ดํดํ๊ณ ๋ค์ํ ๋งค๊ฐ๋ณ์์ ๊ธฐ์ ์ ์คํํจ์ผ๋ก์จ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ๊ณ ๋๋๊ณ ๋ชฐ์ ๊ฐ ์๋ ๊ฒฝํ์ ๋ง๋ค ์ ์์ต๋๋ค. Simplex Noise ๋ฐ ํ๋ํ ๋ ธ์ด์ฆ์ ๊ฐ์ Perlin Noise์ ๋ณํ ๋ฐ ํ์ฅ์ ํ์ํ์ฌ ์ ์ฐจ์ ์์ฑ ๊ธฐ๋ฅ์ ๋์ฑ ํฅ์์ํค๋ ๊ฒ์ ๋๋ ค์ํ์ง ๋ง์ธ์. ์ ์ฐจ์ ์ฝํ ์ธ ์์ฑ์ ์ธ๊ณ๋ ์ฐฝ์์ฑ๊ณผ ํ์ ์ ์ํ ๋ฌดํํ ๊ฐ๋ฅ์ฑ์ ์ ๊ณตํฉ๋๋ค. ๋ค์ด์๋ชฌ๋-์คํ์ด ์๊ณ ๋ฆฌ์ฆ ๋๋ ์ ๋ฃฐ๋ฌ ์คํ ๋งํ์ ๊ฐ์ ๋ค๋ฅธ ์์ฑ ์๊ณ ๋ฆฌ์ฆ์ ํ์ํ์ฌ ๊ธฐ์ ์ธํธ๋ฅผ ๋ํ๋ณด์ธ์.
๊ฒ์ ์ธ๊ณ๋ฅผ ๊ตฌ์ถํ๋ , ๋์งํธ ์ํ์ ๋ง๋ค๋ , ์์ฐ ํ์์ ์๋ฎฌ๋ ์ด์ ํ๋ , Perlin Noise๋ ๋๊ตฌ ์์์์ ๊ท์คํ ์์ฐ์ด ๋ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊น์ด ํ๊ณ , ์คํํ๊ณ , ์ด ๊ธฐ๋ณธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ง๋ค ์ ์๋ ๋๋ผ์ด ๊ฒ์ ๋ฐ๊ฒฌํ์ธ์.